Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

128 lines
4.6 KiB

namespace VRTK.Examples
{
using UnityEngine;
using UnityEngine.UI;
public class PanelMenuSaucerGrid : MonoBehaviour
{
public GridLayoutGroup gridLayoutGroup;
public MeshRenderer changeObject;
public VRTK_PanelMenuItemController panelMenuController;
public Color[] colours = new Color[0];
protected int currentIndex = 0;
protected readonly Color colorDefault = Color.white;
protected readonly Color colorSelected = Color.green;
protected readonly float colorAlpha = 0.25f;
protected enum Direction
{
None,
Up,
Down,
Left,
Right
}
protected virtual void OnEnable()
{
if (panelMenuController != null)
{
panelMenuController.PanelMenuItemSwipeTop += PanelMenuItemSwipeTop;
panelMenuController.PanelMenuItemSwipeBottom += PanelMenuItemSwipeBottom;
panelMenuController.PanelMenuItemSwipeLeft += PanelMenuItemSwipeLeft;
panelMenuController.PanelMenuItemSwipeRight += PanelMenuItemSwipeRight;
panelMenuController.PanelMenuItemTriggerPressed += PanelMenuItemTriggerPressed;
}
SetGridLayoutItemSelectedState(currentIndex);
}
protected virtual void PanelMenuItemTriggerPressed(object sender, PanelMenuItemControllerEventArgs e)
{
if (currentIndex < colours.Length && changeObject != null)
{
changeObject.material.color = colours[currentIndex];
}
}
protected virtual void PanelMenuItemSwipeRight(object sender, PanelMenuItemControllerEventArgs e)
{
MoveSelectGridLayoutItem(Direction.Right);
}
protected virtual void PanelMenuItemSwipeLeft(object sender, PanelMenuItemControllerEventArgs e)
{
MoveSelectGridLayoutItem(Direction.Left);
}
protected virtual void PanelMenuItemSwipeBottom(object sender, PanelMenuItemControllerEventArgs e)
{
MoveSelectGridLayoutItem(Direction.Down);
}
protected virtual void PanelMenuItemSwipeTop(object sender, PanelMenuItemControllerEventArgs e)
{
MoveSelectGridLayoutItem(Direction.Up);
}
protected virtual void SetGridLayoutItemSelectedState(int index)
{
foreach (Transform childTransform in gridLayoutGroup.transform)
{
GameObject child = childTransform.gameObject;
if (child != null)
{
Color color = colorDefault;
color.a = colorAlpha;
child.GetComponent<Image>().color = color;
}
}
Transform selected = gridLayoutGroup.transform.GetChild(index);
if (selected != null)
{
Color color = colorSelected;
color.a = colorAlpha;
selected.GetComponent<Image>().color = color;
}
}
protected virtual bool MoveSelectGridLayoutItem(Direction direction)
{
int newIndex = FindNextItemBasedOnMoveDirection(direction);
if (newIndex != currentIndex)
{
SetGridLayoutItemSelectedState(newIndex);
currentIndex = newIndex;
}
return true;
}
protected virtual int FindNextItemBasedOnMoveDirection(Direction direction)
{
float width = gridLayoutGroup.preferredWidth;
float cellWidth = gridLayoutGroup.cellSize.x;
float spacing = gridLayoutGroup.spacing.x;
int cellsAccross = (int)Mathf.Floor(width / (cellWidth + (spacing / 2))); // quick / dirty
int childCount = gridLayoutGroup.transform.childCount;
switch (direction)
{
case Direction.Up:
int nextUp = currentIndex - cellsAccross;
return (nextUp >= 0) ? nextUp : currentIndex;
case Direction.Down:
int nextDown = currentIndex + cellsAccross;
return (nextDown < childCount) ? nextDown : currentIndex;
case Direction.Left:
int nextLeft = currentIndex - 1;
return (nextLeft >= 0) ? nextLeft : currentIndex;
case Direction.Right:
int nextRight = currentIndex + 1;
return (nextRight < childCount) ? nextRight : currentIndex;
default:
return currentIndex;
}
}
}
}